import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * @author luoqingbo
 * @create 2024/4/26 9:47
 */
public class Leetcode1146 {
    //["SnapshotArray","set","snap","set","get"]
//        [[3],[0,5],[],[0,6],[0,0]]
    public static void main(String[] args) {
//        SnapshotArray snapshotArray = new SnapshotArray(3);
//        snapshotArray.set(0, 5);
//        snapshotArray.snap();
//        snapshotArray.set(0, 6);
//        System.out.println(snapshotArray.get(0, 0));

//        SnapshotArray snapshotArray = new SnapshotArray(4);
//        snapshotArray.snap();
//        snapshotArray.snap();
//        System.out.println(snapshotArray.get(3, 1));
//        snapshotArray.set(2, 4);
//        snapshotArray.snap();
//        snapshotArray.set(1, 4);

//        ["SnapshotArray","set","snap","snap","snap","get","snap","snap","get"]
//        [[1],[0,15],[],[],[],[0,2],[],[],[0,0]]
        SnapshotArray snapshotArray = new SnapshotArray(1);
        snapshotArray.set(0, 15);
        snapshotArray.snap();
        snapshotArray.snap();
        snapshotArray.snap();
        System.out.println(snapshotArray.get(0, 2));
        snapshotArray.snap();
        snapshotArray.snap();
        System.out.println(snapshotArray.get(0, 0));
    }

    static class SnapshotArray {
        private int snapId = 0;

        private List<HashMap<Integer, Integer>> operations;

        private int[] arr;

        public SnapshotArray(int length) {
            arr = new int[length];
            operations = new ArrayList<>();
            for (int i = 0; i < length; i++) {
                operations.add(new HashMap<>());
            }
        }

        public void set(int index, int val) {
            HashMap<Integer, Integer> operationMap = operations.get(index);
            operationMap.put(snapId, val);
        }

        public int snap() {
            return snapId++;
        }

        public int get(int index, int snap_id) {
            if (snap_id > snapId) {
                return 0;
            }
            HashMap<Integer, Integer> operationMap = operations.get(index);
            while (snap_id >= 0) {
                if (operationMap.containsKey(snap_id)) {
                    return operationMap.get(snap_id);
                }
                snap_id--;
            }
            return 0;
        }
    }
}
